package com.ykzb.pay.alipay.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import com.ykzb.pay.alipay.sign.AlipayMD5;

/**
 * 支付宝URL工具类
 * @author wyh
 *
 */
public class AlipayPackUtil {
	
	public static String packPayUrl(String code,double price){

		HashMap<String, String> hm = new HashMap<String, String>();
		hm.put("service", "create_direct_pay_by_user");
		// 采用相同的编码方式
		hm.put("_input_charset", AlipayConfig.getCharset());
		// 物流费用
		hm.put("logistics_fee", "0");
		// 物流费用支付人 BUYER_PAY=买家支付物流费用
		hm.put("logistics_payment", "BUYER_PAY_AFTER_RECEIVE");
		// 物流方式
		hm.put("logistics_type", "EXPRESS");
		// 客户付款后,支付宝调用的页面
		hm.put("notify_url", AlipayConfig.getPayNotifyUrl());
		// 外部交易号,最好具有唯一性,在获取支付宝发来的付款信息时使用.
		hm.put("out_trade_no", code);
		// partnerId(合作伙伴ID)
		hm.put("partner", AlipayConfig.getPartner());
		// 支付类型 1=商品购买,2=服务购买,...
		hm.put("payment_type", "1");
		// 订单金额信息
		hm.put("price", "" + ((double)((int)(price*100))) / 100);
		// 订单商品数量,一般都是写1,它是按照整个订单包来计算
		hm.put("quantity", "1");
		// 客户付款成功后,显示给客户的页面
		//hm.put("return_url", mobilePayReturnUrl);
		// 你的支付宝账户email
		//hm.put("seller_email", accountEmail);
		// 填写在跳到支付宝页面上显示的付款标题信息
		hm.put("subject", "在线充值订单:" + code);
		return packUrl(hm,AlipayConfig.getGateUrl());

		
	}
	/**
	 * 退款URL
	 * @param refundEmail
	 * @param refundDate
	 * @param refundCode
	 * @param refundNum
	 * @param refundDemo
	 * @return
	 */
	public static String packRefundUrl(String refundEmail,String refundDate,String refundCode,int refundNum,String refundData) {
		
		HashMap<String, String> hm = new HashMap<String, String>();
		//
		hm.put("service", "refund_fastpay_by_platform_pwd");
		//合作身份者ID
		hm.put("partner", AlipayConfig.getPartner());
		//编码
		hm.put("_input_charset", AlipayConfig.getCharset());
		//退款通知地址
		hm.put("notify_url", AlipayConfig.getRefundNotifyUrl());
		//卖家支付宝帐户
		hm.put("seller_email", refundEmail);
		//退款当天日期 如：2007-10-01 13:13:13
		hm.put("refund_date", refundDate);
		//批次号格式：当天日期[8位]+序列号[3至24位]，如：201008010000001
		hm.put("batch_no", refundCode);
		//退款笔数 参数detail_data的值中，“#”字符出现的数量加1，最大支持1000笔（即“#”字符出现的数量999个）
		hm.put("batch_num", refundNum+"");
		//退款详细数据具体格式请参见接口技术文档
		hm.put("detail_data", refundData);
		
		return packUrl(hm,AlipayConfig.getGateUrl());

	}
	/**
	 * 转成URL
	 * @param hm
	 * @return
	 */
	public static String packUrl(HashMap<String, String> hm,String url){
      
        List<String> keys = new ArrayList<String>(hm.keySet());
        Collections.sort(keys);

        String result = "";

        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = hm.get(key);

            if (i == keys.size() - 1) {//拼接时，不包括最后一个&字符
            	result = result + key + "=" + value;
            } else {
            	result = result + key + "=" + value + "&";
            }
        }
        
        //生成签名结果
        String sign = AlipayMD5.sign(result, AlipayConfig.getPrivateKey(), AlipayConfig.getCharset());
        result += "&sign="+sign;
        result += "&sign_type=AlipayMD5";

        return url+result;
	}
	
	public static void main(String[] args){
		
	}
}
